package com.czy.java.thread;

/**
 * @author czy
 * @date 2022-2-22 17:43
 */
public class VolatileDemo1 {
    /**
     * volatile关键字
     * 1.内存可见性
     * 2.防止指令重排
     * 3.非原子性
     */

    public volatile int data = 10;

    /**
     * 1.实验一: 定义一个共享资源对象resources,其成员变量data值为10(不用volatile关键字修饰),创建一个a线程,让a线程在3秒钟后修改data的值为0,
     * 一旦data值变为0后,main线程则会打印出 "main线程结束"
     * 2.实验一结果: main线程一直未输出最后一句话
     * 3.原因分析: main线程和a线程开始时都会从主内存读取到data变量的值(10)到自己的工作内存中,在线程a修改data值为10后,main线程并不知道,
     * 所以一直阻塞在while循环语句中,无法打印出最后一句话
     *
     * 4.实验二: 在实验一的基础上给data变量添加volatile关键字修饰
     * 5.实验二结果: main线程打印出 "main线程结束"
     *
     * 6.实验结论:  被volatile修饰的变量 具有内存可见性
     * 7.总结:    a线程在修改完data变量的值为0后,会通知其他线程重新去主内存中读取data变量的值,
     *
     */
    public static void main(String[] args) {
        VolatileDemo1 resources = new VolatileDemo1();

        new Thread(()->{
            try {
                Thread.sleep(3*1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            resources.data=0;
        },"a线程").start();

        while (resources.data==10){

        }
        System.out.println("main线程结束");
    }

}
